package com.mall.auth.service;

import com.mall.common.util.JwtUtil;
import com.mall.common.util.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * Token服务类
 */
@Slf4j
@Service
public class TokenService {

    @Autowired
    private RedisUtil redisUtil;

    @Value("${jwt.expiration:3600000}")
    private Long expiration;
    
    @Value("${jwt.secret:mall-secret}")
    private String secret;

    /**
     * 将Token加入黑名单（登出操作）
     *
     * @param token JWT Token
     * @return 是否成功
     */
    public boolean addToBlacklist(String token) {
        try {
            // 解析Token获取过期时间
            if (JwtUtil.validateToken(token, secret)) {
                // 计算Token剩余有效时间
                long expireTime = getExpireTime(token, secret);
                if (expireTime > 0) {
                    // 将Token存入Redis，设置过期时间
                    redisUtil.set("token:blacklist:" + token, "true", expireTime/1000);
                    return true;
                }
            }
            return false;
        } catch (Exception e) {
            log.error("Token加入黑名单失败: {}", e.getMessage());
            return false;
        }
    }

    /**
     * 检查Token是否在黑名单中
     *
     * @param token JWT Token
     * @return 是否在黑名单中
     */
    public boolean isTokenInBlacklist(String token) {
        try {
            Object value = redisUtil.get("token:blacklist:" + token);
            return "true".equals(value);
        } catch (Exception e) {
            log.error("检查Token黑名单状态失败: {}", e.getMessage());
            return false;
        }
    }

    /**
     * 获取Token剩余有效时间
     *
     * @param token  JWT Token
     * @param secret 密钥
     * @return 剩余有效时间（毫秒）
     */
    private long getExpireTime(String token, String secret) {
        try {
            // 解析Token获取过期时间
            io.jsonwebtoken.Claims claims = JwtUtil.parseToken(token, secret);
            long expireTime = claims.getExpiration().getTime();
            long currentTime = System.currentTimeMillis();
            return expireTime - currentTime;
        } catch (Exception e) {
            log.error("获取Token过期时间失败: {}", e.getMessage());
            return 0;
        }
    }
}